package com.huishi.ui.component;

import javax.swing.*;
import java.awt.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * 全量同步进度信息
 */
public class ProgressDialog extends JFrame {
    private JProgressBar progressBar; // 进度条
    private JTextArea statusText; // 状态信息

    // 上面的信息
    private JLabel timeLabel; // 显示时间的标签
    private JLabel processedLabel; // 处理的表标签
    private int totalTable; // 总的表数
    private int processedTable; // 已同步表数

    private Timer timer; // 计时器
    private long startTime; // 同步开始时间

    public void setTotalTable(int totalTable) {
        this.totalTable = totalTable;
    }

    /**
     * 在JFrame中弹出
     *
     * @param parent
     */
    public ProgressDialog(JFrame parent) {
        setTitle("同步进度");
        setSize(600, 250);
        setLocationRelativeTo(parent);

        // 禁用最大化按钮
        setResizable(false);
        setExtendedState(JFrame.MAXIMIZED_BOTH);

        // 进度条
        progressBar = new JProgressBar(0, 100);
        progressBar.setStringPainted(true);

        // 初始化标签
        processedLabel = new JLabel();
        timeLabel = new JLabel("时间:" + createSpaces(12) + "00:00:00");

        // 创建一个新的面板来显示所有标签
        JPanel infoPanel = new JPanel();
        infoPanel.setLayout(new GridLayout(0, 1)); // 使用网格布局，单列多行
        infoPanel.add(processedLabel);
        infoPanel.add(timeLabel);

        // 进度信息
        statusText = new JTextArea("[Status][Sync] Waiting to start...");
        statusText.setEditable(false);
        statusText.setLineWrap(true); // 自动换行
        statusText.setWrapStyleWord(true); // 以单词为单位换行


        JScrollPane scrollPane = new JScrollPane(statusText);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

        JPanel panel = new JPanel(new BorderLayout(0, 20));
        panel.add(infoPanel, BorderLayout.NORTH);
        panel.add(scrollPane, BorderLayout.CENTER);

        add(panel);

        // 初始化计时器 每秒执行一次
        timer = new Timer(1000, e -> {
            long elapsedTime = System.currentTimeMillis() - startTime;
            String formattedTime = formatElapsedTime(elapsedTime);
            timeLabel.setText("时间:" + createSpaces(12) + formattedTime);
        });

        startTime = System.currentTimeMillis();
        timer.start();
    }

    /**
     * 格式化经过的时间
     *
     * @param elapsedTime 经过的时间（毫秒）
     * @return 格式化后的时间字符串（时:分:秒）
     */
    private String formatElapsedTime(long elapsedTime) {
        SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
        format.setTimeZone(TimeZone.getTimeZone("GMT"));
        Date date = new Date(elapsedTime);
        return format.format(date);
    }

    /**
     * 开始计时器
     */
    public void startTimer() {
        startTime = System.currentTimeMillis();
        timer.start();
    }

    /**
     * 停止计时器
     */
    public void stopTimer() {
        timer.stop();
    }

    /**
     * 更新进度
     *
     * @param progress 进度值（0-100）
     */
    public void updateProgress(int progress) {
        progressBar.setValue(progress);
    }

    /**
     * 更新同步状态
     *
     * @param status 状态信息
     * @param flag   false表示表同步完成
     */
    public void updateStatus(String status, boolean flag) {
        statusText.append("\n" + status);
        resizeTextArea();

        if (!flag) {
            processedTable++;
            setProcessedText(processedTable, null);
        }
    }

    public void setProcessedText(Integer processedTable, Integer totalTable) {
        String text = "已处理:" + createSpaces(9) + processedTable + "/ " + (totalTable == null ? this.totalTable : totalTable) + " processed";
        processedLabel.setText(text);
    }

    private String createSpaces(int count) {
        StringBuilder spaces = new StringBuilder();
        for (int i = 0; i < count; i++) {
            spaces.append(" ");
        }
        return spaces.toString();
    }


    /**
     * 调整 JTextArea 的高度以适应内容
     */
    private void resizeTextArea() {
        statusText.setSize(statusText.getPreferredSize());
        SwingUtilities.invokeLater(() -> {
            JScrollPane scrollPane = (JScrollPane) statusText.getParent().getParent();
            scrollPane.revalidate();
            scrollPane.repaint();
        });
    }

    public static void main(String[] args) {

        ProgressDialog progressDialog = new ProgressDialog(null);
        progressDialog.setVisible(true);

        // 模拟进度更新和状态更新
        Executors.newScheduledThreadPool(1).scheduleAtFixedRate(() -> {
            SwingUtilities.invokeLater(() -> {
                int currentProgress = progressDialog.progressBar.getValue();
                if (currentProgress < 100) {
                    progressDialog.updateProgress(currentProgress + 10);
                    progressDialog.updateStatus("Progress: " + (currentProgress + 10) + "%", true);
                }
            });
        }, 1, 5, TimeUnit.SECONDS);
    }
}
